package com.yl.entity;

import com.yl.entity.cdc.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.flink.api.java.tuple.Tuple2;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MultiDataEntity implements Serializable {

    private static final long serialVersionUID = -457566433778417297L;

    /**
     * 基本信息
     */
    // 项目信息
    private BaseProject project;
    // 用户信息
    private List<AuthUser> users;
    // 测点信息
    private BaseTarget target;
    // 测点类型信息
    private BaseTargetType targetType;
    // 指标信息
    private List<SettingsDataQuota> quotas;
    // 阈值信息
    private Map<Integer, List<SettingsThreshold>> ths;

    /**
     * 采集信息
     */
    // 采集时间（16位微秒时间戳）
    private Long pickTime;
    // 采集的指标数据，指标序号对应的数据
    private Map<Integer, Double> rawValues;
    // 数据包信息
    private Packet packet;

    /**
     * 计算信息
     */
    // 计算类型唯一标识
    private String calKey;
    // 计算类型编号
    private String calTypeCode;
    // 计算的指标数据，指标序号对应的数据
    private Tuple2<Integer, Double> calValues;

    /**
     * 获取测点的数据间隔，单位秒，默认1Hz，即最快一秒更新一次
     * 1.该数据间隔用于测点缓存状态更新；
     * 2.数据频率大于1Hz的按1Hz来处理，即每秒更新下测点状态；
     * 3.数据频率小于1Hz的按照数据库配置的实际数据间隔处理；
     * 4.为避免网络波动或延迟影响数据间隔，这个在原始数据间隔上再给5秒延迟；
     */
    public int getInterval() {
        // 默认测点状态最快更新频率一秒一次
        int interval = 1;
        // 默认网络延迟容忍5秒
        int delayTolerant = 5;
        // 数据间隔优先使用测点配置的，若测点未配置则使用所属类型配置的
        Double frequency = this.target.getInterval();
        frequency = null != frequency ? frequency / 1000 : this.targetType.getInterval() / 1000;
        return frequency > 1 ? frequency.intValue() + delayTolerant : interval;
    }

}
